package com.zjff.show.zjffshow.tool;

import com.zjff.show.zjffshow.entity.CuKey;
import com.zjff.show.zjffshow.tool.BaiDu.ConnUtil;
import com.zjff.show.zjffshow.tool.BaiDu.TokenHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;

//百度TTS生成语音并播放

public class TTSTool {
    /**
     * @param Text 需要转为音乐的文字,
     * @return 前端返回最后的音乐地址
     */

    // 发音人选择, 基础音库：0为度小美，1为度小宇，3为度逍遥，4为度丫丫，
    // 精品音库：5为度小娇，103为度米朵，106为度博文，110为度小童，111为度小萌，默认为度小美
    private final int per = 0;
    // 语速，取值0-15，默认为5中语速
    private final int spd = 5;
    // 音调，取值0-15，默认为5中语调
    private final int pit = 5;
    // 音量，取值0-9，默认为5中音量
    private final int vol = 5;
    // 下载的文件格式, 3：mp3(default) 4： pcm-16k 5： pcm-8k 6. wav
    private final int aue = 6;
    public final String url = "http://tsn.baidu.com/text2audio"; // 可以使用https
    private String cuid = "15849880";
    public String PlayAudioByString(String Text) {
        String result = "";//返回的音乐地址
        try {
            TokenHolder holder = new TokenHolder("zNGQCfmEuXWDQ9OxhyTExgFg","83DIjnoCSSUUGfOWyiWdeZSMtAB9rH6D", TokenHolder.ASR_SCOPE);
            holder.refresh();
            String token = holder.getToken();
            // 此处2次urlencode， 确保特殊字符被正确编码
            String params = "tex=" + ConnUtil.urlEncode(ConnUtil.urlEncode(Text));
            params += "&per=" + per;
            params += "&spd=" + spd;
            params += "&pit=" + pit;
            params += "&vol=" + vol;
            params += "&cuid=" + cuid;
            params += "&tok=" + token;
            params += "&aue=" + aue;
            params += "&lan=zh&ctp=1";
          //  System.out.println(url + "?" + params); // 反馈请带上此url，浏览器上可以测试
            HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setConnectTimeout(5000);
            PrintWriter printWriter = new PrintWriter(conn.getOutputStream());
            printWriter.write(params);
            result = url + "?" + params;
            System.out.println(result);
            printWriter.close();
            String contentType = conn.getContentType();
            if (contentType.contains("audio/")) {
                byte[] bytes = ConnUtil.getResponseBytes(conn);
                String format = getFormat(aue);
                File file = new File("result." + format); // 打开mp3文件即可播放
                FileOutputStream os = new FileOutputStream(file);
                os.write(bytes);
                os.close();
                System.out.println("audio file write to " + file.getAbsolutePath());
            } else {
                System.err.println("ERROR: content-type= " + contentType);
                String res = ConnUtil.getResponseString(conn);
                System.err.println("最后结果:"+res);
            }
        } catch (Exception e) {
                System.out.println(e.getMessage());
        }
        return result;
    }

    // 下载的文件格式, 3：mp3(default) 4： pcm-16k 5： pcm-8k 6. wav
    private String getFormat(int aue) {
        String[] formats = {"mp3", "pcm", "pcm", "wav"};
        return formats[aue - 3];
    }
}
